﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace Busconeitor.BusinessLayer.Util
{
    //TODO esto queda pendiente de revision
    public class Utilidades
    {
        public static string ResaltarPalabrasClave(string texto, List<string> palabrasClave)
        {
            var tagInicio = "<span style='background-color: #FFFF00'>";
            var tagFin = "</span>";
            var palabrasCoincidentes = new List<string>();

            foreach (var item in palabrasClave)
            {
                var matcherKeyword = ObtenerMatcherCaseInsensitive(item, texto);

                if (matcherKeyword.Success)
                {
                    foreach (var grupo in matcherKeyword.Groups)
                    {
                        palabrasCoincidentes.Add(grupo.ToString());
                    }
                }
            }

            foreach (var item in palabrasCoincidentes)
            {
                if (!string.IsNullOrEmpty(item))
                {
                    var hResult = new StringBuilder(tagInicio);
                    hResult.Append(item);
                    hResult.Append(tagFin);
                    texto = texto.Replace(item, hResult.ToString());
                }
            }

            return texto;
        }

        public static string ResaltarPalabrasClavePrueba(string texto, List<string> palabrasClave)
        {
            var startTag = "<span style='background-color: #FFFF00'>";
            var endTag = "</span>";
            var nuevaListaKeywords = new List<String>();

            foreach (var item in palabrasClave)
            {
                if (!string.IsNullOrEmpty(item))
                {
                    var matcherKeyword = ObtenerMatcherCaseInsensitive(item, texto);

                    //while (matcherKeyword.find())
                    //{
                    //    nuevaListaKeywords.add(matcherKeyword.group());
                    //}
                    if (matcherKeyword.Success)
                    {
                        foreach (var grupo in matcherKeyword.Groups)
                        {
                            nuevaListaKeywords.Add(grupo.ToString());
                        }   
                    }
                }
            }

            var textoNuevo = string.Empty;
            var textoCorto = string.Empty;
            var cortarHasta = 0;
            var renglones = 0;

            foreach (var item in nuevaListaKeywords)
            {
                //TODO revisar y probar
                //if (texto.split(string) != null && (texto.split(string)).length >= 2)
                var q = (texto.Split(item.ToCharArray())).Length;

                if (q >= 2)
                {
                    var indPal = texto.IndexOf(item, StringComparison.Ordinal);

                    if (indPal - 10 > 0)
                    {
                        //textoNuevo = texto.Substring(indPal - 10, texto.Length);
                        textoNuevo = texto.Substring(indPal - 10);
                    }
                    else
                    {
                        textoNuevo = texto.Substring(indPal, texto.Length);
                    }
                    //textoNuevo = texto.split(string, 2)[1];
                    if (textoNuevo.Length - 1 >= 100)
                    {
                        cortarHasta = 100;
                    }
                    else
                    {
                        cortarHasta = textoNuevo.Length;
                    }

                    //textoCorto = textoCorto + "..." + string + textoNuevo.substring(0, cortarHasta) + "...<br>";
                    textoCorto = textoCorto + "..." + textoNuevo.Substring(0, cortarHasta) + "...<br>";
                    int cortarDesde = textoNuevo.Substring(0, cortarHasta).Length - 1;

                    if (cortarDesde < textoNuevo.Length - 1)
                    {
                        texto = textoNuevo.Substring(cortarDesde, textoNuevo.Length - 1);
                    }
                    else
                    {
                        texto = textoNuevo;
                    }

                    renglones++;

                    if (renglones > 5)
                    {
                        break;
                    }
                }
            }

            if (textoCorto.Length == 0)
            {
                textoCorto = texto.Substring(0, texto.Length < 400 ? texto.Length : 400);
            }

            foreach (var item in nuevaListaKeywords)
            {
                if (!string.IsNullOrEmpty(item))
                {
                    var hResult = new StringBuilder(startTag);
                    hResult.Append(item);
                    hResult.Append(endTag);
                    textoCorto = textoCorto.Replace(item, hResult.ToString());
                }
            }

            return textoCorto;
        }

        private static Match ObtenerMatcherCaseInsensitive(string expresionRegular, string texto)
        {
            Regex regex = new Regex(expresionRegular, RegexOptions.IgnoreCase);
            Match match = regex.Match(texto);
            return match;
            //Pattern regex = Pattern.Compile(expresionRegular, Pattern.CASE_INSENSITIVE);
            //Matcher regexMatcher = regex.Matcher(texto);
            //return regexMatcher;
        }
    }
}
